{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 提示模板有助于将用户输入和参数转换为语言模型的指令。这可以用来指导模型的响应，帮助它理解上下文并生成相关和连贯的基于语言的输出。\n",
    "- 提示模板将字典作为输入，其中每个键代表提示模板中要填写的变量。\n",
    "- 提示模板输出一个PromptValue。此PromptValue可以传递给LLM或ChatModel，也可以转换为字符串或消息列表。此PromptValue存在的原因是为了便于在字符串和消息之间切换。\n",
    "- 有几种不同类型的提示模板："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- String PromptTemplates 字符串提示模板\n",
    "- 这些提示模板用于格式化单个字符串，通常用于更简单的输入。例如，构造和使用PromptTemplate的常用方法如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "StringPromptValue(text='这是一段关于langchain的介绍.')"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain_core.prompts import PromptTemplate\n",
    "\n",
    "prompt_template = PromptTemplate.from_template(\n",
    "    \"这是一段关于{name}的介绍.\"\n",
    ")\n",
    "\n",
    "prompt_template.invoke({\"name\": \"langchain\"})\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- ChatPromptTemplates 聊天提示模板\n",
    "- 这些提示模板用于格式化消息列表。这些“模板”本身由模板列表组成。例如，构建和使用ChatPromptTemplate的常用方法如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ChatPromptValue(messages=[SystemMessage(content='你是一个数据库专家'), HumanMessage(content='请对这条SQL`select * from user;`进行优化')])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "\n",
    "prompt_template = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"你是一个数据库专家\"),\n",
    "    (\"user\", \"请对这条SQL`{SQL}`进行优化\")\n",
    "])\n",
    "\n",
    "prompt_template.invoke({\"SQL\": \"select * from user;\"})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- MessagesPlaceholder 消息占位符\n",
    "- 这个提示模板负责在特定的place.In添加消息列表在上面的ChatPromptTemplate中，我们看到了如何格式化两条消息，每条消息都是一个字符串。\n",
    "- 但是如果我们想让用户传入一个消息列表，我们会把它插入一个特定的位置呢？这就是你如何使用消息占位符。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ChatPromptValue(messages=[SystemMessage(content='你是一个歌手'), HumanMessage(content='青花瓷')])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n",
    "from langchain_core.messages import HumanMessage\n",
    "\n",
    "prompt_template = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"你是一个歌手\"),\n",
    "    MessagesPlaceholder(\"msgs\")\n",
    "])\n",
    "\n",
    "prompt_template.invoke({\"msgs\": [HumanMessage(content=\"青花瓷\")]})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 在不显式使用MessagesPlaceholder类的情况下完成同样的事情的另一种方法是："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ChatPromptValue(messages=[SystemMessage(content='你是一个乐于帮助人的智能体'), HumanMessage(content='请为我写一个Python程序，求两个数的和。')])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prompt_template = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"你是一个乐于帮助人的智能体\"),\n",
    "    (\"placeholder\", \"{msgs}\") # <-- This is the changed part\n",
    "])\n",
    "\n",
    "prompt_template.invoke({\"msgs\": [HumanMessage(content=\"请为我写一个Python程序，求两个数的和。\")]})"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
